package com.zenithmind.disk.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.disk.pojo.domain.Share;
import com.zenithmind.disk.pojo.dto.ShareDTO;
import com.zenithmind.disk.pojo.query.ShareQuery;
import com.zenithmind.disk.pojo.vo.FileVO;
import com.zenithmind.disk.pojo.vo.ShareVO;
import com.zenithmind.common.result.PageResult;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.List;

public interface ShareService extends IService<Share> {
    /**
     * 创建分享
     * @param shareDTO 分享信息
     * @param userId 用户ID
     * @return 分享信息
     */
    ShareVO createShare(ShareDTO shareDTO, String userId);

    /**
     * 获取公共分享
     * @param shareCode 分享码
     * @param password 提取密码
     * @return 文件信息
     */
    FileVO getPublicShare(String shareCode, String password);

    /**
     * 列出我的分享
     * @param userId 用户ID
     * @return 分享列表
     */
    List<ShareVO> listMyShares(String userId);

    /**
     * 取消分享
     * @param shareId 分享ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean cancelShare(String shareId, String userId);

    /**
     * 验证分享密码
     * @param shareCode 分享码
     * @param password 提取密码
     * @return 是否成功
     */
    boolean validateSharePassword(String shareCode, String password);
    
    /**
     * 下载分享文件
     * @param shareCode 分享码
     * @param password 提取密码
     * @param response HTTP响应对象
     * @throws IOException 如果发生I/O错误
     */
    void downloadShare(String shareCode, String password, HttpServletResponse response) throws IOException;
    
    /**
     * 下载分享文件夹中的指定文件
     * @param shareCode 分享码
     * @param fileId 文件ID
     * @param password 提取密码
     * @param response HTTP响应对象
     * @throws IOException 如果发生I/O错误
     */
    void downloadSharedFile(String shareCode, String fileId, String password, HttpServletResponse response) throws IOException;
    
    /**
     * 检查文件是否在分享目录树下
     * @param shareRootId 分享根目录ID
     * @param fileId 要检查的文件ID
     * @param userId 用户ID
     * @return 是否在分享目录树下
     */
    boolean isFileInShareTree(String shareRootId, String fileId, String userId);

    /**
     * 分页查询分享列表
     * @param shareQuery 分享查询条件
     * @return 分页查询结果
     */
    PageResult<ShareVO> sharePage(ShareQuery shareQuery);

    /**
     * 批量删除分享-管理员
     * @param ids 分享ID列表
     * @return 是否成功
     */
    boolean deleteBatchShares(List<String> ids);

    /**
     * 管理员添加或修改分享
     * @param share 分享信息
     * @return 分享信息
     */
    ShareVO addOrUpdateShareByAdmin(Share share);
}
